02
Abbiamo messo il programma su Github
Che differenza c'è tra dimensional reduction e feature selection
Cosa faremo oggi
Installazione di Python (poco)
Matplotlib e visualizzazione
La prox settimana
https://jakevdp.github.io/WhirlwindTourOfPython/
https://www.youtube.com/watch?v=pCp0a5_YIWE
Come importo una libreria grafica?
from matplotlib.pyplot import *
from pylab import *
from numpy import *
Omporta direttamente i comandi
NON FARLO (a meno che non sei Jeremy Howard)
non è Pep8 e non sai poi da che libreria vengono i comandi che stai usando
import matplotlib.pyplot as plt
import numpy as np
Così chiami il comando con es plt.comando o np.comando
%matplotlib inline
%matplotlib notebook
%matplotlib widget
https://github.com/matplotlib/ipympl/blob/master/matplotlib.gif
se ne volete un'altra la create esplicitamente
per creare una griglia
La più usata è di solito la 2x2
senza al "s" si possono aggiungere assi alla figura già aggiunta
ax = plt.subplot(n, m, i) # or plt.subplot(nmi)
# places ax at position i in n x m grid
# (1-based index) i numeri vanno colonna per colonna
ax11 = plt.subplot(2, 2, 1)
ax12 = plt.subplot(2, 2, 2)
ax21 = plt.subplot(2, 2, 3)
ax22 = plt.subplot(2, 2, 4)
#equivalente ma meno bello perché nel primo caso posso creare layout irregolari riempiendo quello che voglio
#(cosa fa il comando ravel???)
fig, axes = plt.subplots(2, 2)
ax11, ax12, ax21, ax22 = axes.ravel()
ax = plt.subplot(n, m, i) # or plt.subplot(nmi)
# places ax at position i in n x m grid
# (1-based index)
ax11 = plt.subplot(2, 2, 1)
ax12 = plt.subplot(2, 2, 2)
ax2 = plt.subplot(2, 1, 2)
la modalità stateful è la più usata, quella a oggetti la più versatile
sin = np.sin(np.linspace(-4, 4, 100))
è il vostra prima vera istruzione di Python. Cosa fa?
Vedete np.sin e np.linspace
plt.subplot(2, 2, 1)
plt.plot(sin)
plt.subplot(2, 2, 2)
plt.plot(sin, c='r')
#
#
fig, axes = plt.subplots(2, 2)
axes[0, 0].plot(sin)
axes[0, 1].plot(sin, c='r')
Perché in orizzontale sugli assi non sono riportati valori tra -4 e 4?
plt.title
plt.xlim, plt.ylim
plt.xlabel, plt.ylabel
plt.xticks, plt.yticks
#
#
ax = plt.gca() # get current axes
fig = plt.gcf() # get current figure
#
#
ax.set_title
ax.set_xlim, ax.set_ylim
ax.set_xlabel, ax.set_ylabel
ax.set_xticks, ax.set_yticks (& ax.set_xtick_labels)
Dopo vedremo degli esempi anche da Seaborn
fig, ax = plt.subplots(2, 4, figsize=(10, 5))
ax[0, 0].plot(sin)
ax[0, 1].plot(range(100), sin) # same as above
ax[0, 2].plot(np.linspace(-4, 4, 100), sin)
ax[0, 3].plot(sin[::10], 'o')
ax[1, 0].plot(sin, c='r')
ax[1, 1].plot(sin, '--')
ax[1, 2].plot(sin, lw=3)
ax[1, 3].plot(sin[::10], '--o')
plt.tight_layout() # makes stuff fit - usually works
Cosa succede in [0, 2] ? Cosa in [0, 3]?
Andate a rivedervelo sin[::10] è lo slicing di un array
fig, ax = plt.subplots(1, 4, figsize=(10, 3),
subplot_kw={'xticks': (), 'yticks': ()})
ax[0].plot(x, y, 'o')
ax[1].scatter(x, y)
ax[2].scatter(x, y, c=x-y, cmap='bwr', edgecolor='k')
ax[3].scatter(x, y, c=x-y, s=sizes, cmap='bwr', edgecolor='k')
fig, ax = plt.subplots(1, 3, figsize=(20, 3))
ax[0].hist(data)
ax[1].hist(data, bins=1000)
ax[2].hist(data, bins="auto")
Cos'è un istogramma? In verticale ho il numero di conteggi di oggetti che hanno una qualità numerica ripostata in orizzontale.
Dal grafico sembra che i valori si distribuiscono come una campana con sovrapposti altri due picchi. Notate come il dettaglio sul modo in cui si distriscono i valori dipende dal numero di bin
Come l'istogramma ma categorico. In orizzontale ho una qualità categorica i.e. discreta riguardante categorie separate
Grafica "matrici" di valori in due dimensioni il colore indica l'altezza / il valore del singolo elemento.
fig, ax = plt.subplots(2, 2)
im1 = ax[0, 0].imshow(arr)
ax[0, 1].imshow(arr, interpolation='bilinear')
im3 = ax[1, 0].imshow(arr, cmap='gray')
im4 = ax[1, 1].imshow(arr, cmap='bwr',
vmin=-1.5, vmax=1.5)
plt.colorbar(im1, ax=ax[0, 0])
plt.colorbar(im3, ax=ax[1, 0])
plt.colorbar(im4, ax=ax[1, 1])
[ref] https://matplotlib.org/stable/gallery/images_contours_and_fields/interpolation_methods.html
Se abbiamo molti dati lo scatter plot nasconde molto dettaglio a causa dell'overdensity. Possiamo combattere questo fenomeno scegliendo la trasparenza alpha
fig, ax = plt.subplots(1, 3, figsize=(10, 4),
subplot_kw={'xlim': (-1, 1),
'ylim': (-1, 1)})
ax[0].scatter(x, y)
ax[1].scatter(x, y, alpha=.1)
ax[2].scatter(x, y, alpha=.01)
Oppure usiamo hexbin un tipo di istogramma 2d
La figura precedente a stella verrebbe
plt.figure()
plt.hexbin(x, y, bins='log', extent=(-1, 1, -1, 1))
plt.colorbar()
plt.axis("off")
(extent regola i boundingbox)
Come graficare funzioni di diversi ordini di grandezza?
Uso due assi diversi sullo stesso grafico!
ax1 = plt.gca()
line1, = ax1.plot(years, phds)
ax2 = ax1.twinx()
line2, = ax2.plot(years, revenue, c='r')
ax1.set_ylabel("Math PhDs awarded")
ax2.set_ylabel("revenue by arcades")
ax2.legend((line1, line2),
("math PhDs awarded", "revenue by arcades"))
La stessa funzione con differenti rapporti di aspetto
L'inclinazione media a 45 gradi
https://eagereyes.org/basics/banking-45-degrees
(avanzato guardate il comando GridSpec )
Partire o non partire da zero?
https://eagereyes.org/basics/baselines
L'iris dataset il dataset più usato in assoluto negli esempi di classificazione.
Avete mai visto "Atypical" ?
da https://seaborn.pydata.org/tutorial/distributions.html
Quantità rispetto alla dimensione dell'ala
Se scaliamo le altezze facendo in modo che la somma delle altezze di tutte le barre faccia 1 abbiamo normalizzato e sia arrivati a una stima della distribuzione di probabilità DISCRETA.
Kernel density estimation (KDE)
Sto graficando quello che si chiama funzione cumulativa della distribuzione. Se la distribuzione fosse una gaussiana avrei una sigmoide .
L'ECD è molto utile per separare le tre specie ed è molto più regolare dell'istogramma
Se metto in ordine le misure rispetto ad esempio a total_bill il valore a metà dell'ordinamento è la mediana. La mediana divide la distribuzione in due parti l'una 50% e 50%.
I quantili sono la divisione della distribuzione in
Q0 0% il valore minimo
Q1 25%
Q2 50% la Mediana
Q3 75%
Q4 100% il valore massimo
Q2 indica bene il centro della distribuzione ed è un valore Centrale
Q3 - Q2 indica bene l'allargamento della distribuzione ed è un valore di dispersione